第1章 软件工程学的概述

1.1 软件危机

软件危机是指在计算机的开发和维护过程中所遇到的一系列严重问题。

软件危机包含两方面问题:

  1. 如何开发软件,以满足对软件日益增长的需求
  2. 如何维护数量不断膨胀的已有软件

软件危机的典型表现:

  1. 对软件开发成本和进度的估计常常很不准确
  2. 用户对“已完成的”软件系统不满意的现象经常发生
  3. 软件产品的质量往往靠不住
  4. 软件常常是不可维护的
  5. 软件通常没有适当的文档资料
  6. 软件成本在计算机系统总成本中所占比例逐年上升
  7. 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及及深入的趋势

产生软件危机的原因:

  1. 与软件本身的特点有关
  2. 和软件开发与维护的方法不正确有关

软件的定义:软件是程序、数据及相关文档的完整集合。其中,程序是能够完成预定功能和性能的可执行的指令序列;数据是使程序能够适当地处理信息的数据结构;文档是开发、使用和维护程序所需要的图文资料。

消除软件危机的途径:

  1. 技术措施(方法和工具)
  2. 必要的组织管理措施

1.2 软件工程

软件工程的概念:软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。

软件工程具有的本质特性:

  1. 软件工程关注于大型程序的构造
  2. 软件工程的中心课题是控制复杂度
  3. 软件经常变化
  4. 开发软件的效率非常重要
  5. 和谐地合作是开发软件的关键
  6. 软件必须有效地支持它的用户
  7. 软件工程领域中通常具有一种文化背景的人替具有另一种文化背景的人创造产品

软件工程的7条基本原理是确保软件产品质量和开发效率的原理的最小集合:

  1. 用分析段的生命周期计划严格管理
  2. 坚持进行阶段评审
  3. 实行严格的产品控制,主要实行基准配置(基线配置)管理,也称变动控制
  4. 采用现代程序设计技术
  5. 结果应能清除地审查
  6. 开发小组的人员应该少而精
  7. 承认不断改进软件工程实践的必要性

软件工程方法学:

  1. 通常把软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为范型。
  2. 软件工程方法学包含3个要素:方法、工具和过程
  3. 目前使用最广泛的软件工程方法学:传统方法学、面向对象方法学

传统方法学:

  • 采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发过程的各项任务
  • 把软件生命周期的全过程依次划分为若干个阶段,顺序完成每个阶段的任务
  • 每一个阶段的开始和结束都有严格的标准,前一阶段的结束是后一阶段的开始
  • 每一个阶段结束之前都必须进行正式严格的技术审查和管理复审

面向对象方法学:

  • 把对象(Object)作为融合了数据及在数据上的操作行为的统一的软件构件
  • 把所有对象都划分成类(class)
  • 按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。
  • 对象彼此间仅能通过发送消息互相联系

1.3 软件生命周期

img

概括地说,软件生命周期由软件定义、软件开发和运行维护(也称软件维护)3个时期组成,每个时期有劲一步划分成若干阶段。

软件定义时期的任务是: 确定软件开发工程必须完成的总目标;确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制定工程进度表。这个时期的工作通常又称为系统分析,由系统分析员负责完成。软件定义时期通常进一步划分成3个阶段,即问题定义、可行性研究和需求分析。

开发时期具体设计和实现在前一个时期定义的软件,它通常由下述4个阶段组成:总体设计,详细设计,编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。

维护时期的主要任务是使软件持久地满足用户的需要。

软件生命周期每个阶段的基本任务:

  1. 问题定义:系统分析员通过对客户的访问调查,简明扼要地写出关于问题性质、工程目标和工程规模的书面报告,经过讨论和必要修改后得到客户的确认
  2. 可行性研究:研究问题的范围,探索问题是否值得去解,是否有可行的解决办法
  3. 需求分析:确定系统的逻辑模型,通常用数据流图、数据字典和简要的算法表示
  4. 总体设计:设计出目标系统的可能方案,设计程序的体系结构
  5. 详细设计:设计出程序的详细规格说明
  6. 编码和单元测试:写出正确的容易理解、容易维护的程序模块
  7. 综合测试:通过各种类型的测试(及相应的调试)使软件达到预定的要求
  8. 软件维护:通过各种必要的维护活动使系统持久地满足用户的需要

1.4 软件过程

软件过程描述了为了开发出客户需要的软件,什么人(who)、在什么时候(when)、做什么事(what)以及怎样(how)做这些事以实现一个特定的具体目标。

软件过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑。

通常使用生命周期模型简洁地描述软件过程。生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序。

瀑布模型

瀑布模型(WaterfallModel)又称流水式过程模型,它将软件开发过程模仿旅游景点的阶梯瀑布,由上向下一个阶梯一个阶梯地倾泻下来,最后进入一个风平浪尽的大湖,这个大湖就是软件企业的产品库。

image-20200904204601249

传统软件工程方法学的软件过程,基本上可用用瀑布模型来描述。

传统瀑布模型过于理想化,实际的瀑布模型是带“反馈环”的。

瀑布模型有许多优点:可强迫开发人员采用规范的方法(例如,结构化技术); 严格地规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。

“瀑布模型是由文档驱动的“这个事实也是它的一个主要缺点。在可运行的软件产品交付给用户之前,用户只能通过文档来了解产品是什么样的。很可能导致最终开发出的软件产品不能真正满足用户的需要。

快速原型模型

以某个软件原型为参照模型的开发方法,叫做原型法。在初步需求分析之后,马上向客户展示一个软件产品原型,对客户进行培训,让客户试用,在试用中收集客户意见,修改原型,再让客户试用,反复循环几次,直到客户确认为止。

第一步是快速建立一个能反映用户主要需求的原型系统,让用户试用提出修改意见,开发人员根据意见快速地修改原型系统。

快速原型模型是不带反馈环的,这正是这种过程模型的优点:软件产品的开发基本上是线性顺序进行的。

增量模型

增量模型将软件产品看作一组增量构件,每次设计、实现、集成、测试和交付一块构件,直到所有构件全部实现为止。

image-20200904204638535

增量模型也称为渐增模型。

使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。

优点:

  1. 能在短时间内向用户提交可完成部分功能的产品
  2. 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给用户组织带来的冲击

螺旋模型

基本思想:使用原型及其他方法来尽量降低风险。

理解这种模型的简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。

优势兼弱点:它是风险驱动的

螺旋模型有许多优点:有利于已有软件的重用,有助于把软件质量作为软件开发的一个重要目标;减少了过多测试或测试不足所带来的风险;在维护和开发之间并没有本质区别。

主要适用于内部开发大规模软件项目

要求软件开发人员具有丰富的风险评估经验和这方面的专门知识

喷泉模型

面向对象的软件过程模型,具有迭代和无缝的特性

Rationl统一模型(RUP)

敏捷过程与极限编程

微软过程

1.5小结

  • 软件 =程序+数据+文档
  • 软件危机: 原因,现象,办法 (软件工程学)
  • 软件工程(学): 开发、运行和维护软件的系统方法
  • 软件工程3个要素:方法、工具和过程。
  • 软件生命周期: 定义,开发,运行维护
  • 软件过程: 瀑布模型+RUP